home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-12-14 | 5.8 KB | 254 lines | [TEXT/KAHL] |
- /*
- mod 10 29 86 tsh - put MOVEM's back in!
- mod 10 18 86 tsh - LSC 1.41 version
- mod 9 14 86 tsh - fix symbol for cpybuf
- MOD 08-28-86 MAZ - cpybuf, fillbuffer and long versions in ass'y code
- */
-
- /* copy buffer of size from source to dest */
- longcpybuf(dest,source,size)
- char *dest;
- char *source;
- long size;
- {
- asm
- {
- MOVE.L A2,-(SP) ; save A2
- MOVEA.L dest,A0 ; COPY dest
- MOVE.L source,A1 ; COPY source
- MOVE.L size,D2 ; LONG-EXTEND SIZE
- BLE.S @3
-
- ; NONZERO MOVE
- CMPA.L A0,A1 ; SOURCE <CMP> DEST
- BGT.S @4
- ; TEST FOR OVERLAP
- MOVE.L A1,A2
- ADDA.L D2,A2 ; MAKE ONE PAST SOURCE BUF (SRCEND)
- CMPA.L A2,A0 ; DEST <CMP> SRCEND
- BGE.S @4 ; IMPLIES NO OVERLAP
- ADDA.L D2,A0 ; MAKE END OF DEST ARRAY
- ; BACKWARDS LOOP
- MOVE.L D2,D0
- LSR.L #3,D0 ; COMPUTE BATCHES
- BEQ.S @2 ; GO FINISH UP REMAINDER - SMALL MOVE
- ANDI.B #7,D2 ; TAKE REMAINDER (NOTE GUARANTEED SMALL)
- @1: MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- SUBQ.L #1,D0 ; ONE LESS BATCH
- BGT.S @1
- TST.B D2 ; ANY ODD STUFF LEFT?
- BEQ.S @3
- ; PROCESS 7 OR LESS MOVES
- @2: MOVE.B -(A2),-(A0) ; MOVE A BYTE
- SUBQ.B #1,D2
- BGT.S @2
- @3: MOVE.L (SP)+,A2 ; restore A2
- return
-
- ; FORWARDS LOOP
- @4: MOVE.L D2,D0
- LSR.L #3,D0 ; COMPUTE BATCHES
- BEQ.S @6 ; GO FINISH UP REMAINDER - SMALL MOVE
- ANDI.B #7,D2 ; TAKE REMAINDER (NOTE GUARANTEED SMALL)
- @5: MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- SUBQ.L #1,D0 ; ONE LESS BATCH
- BGT.S @5
- TST.B D2 ; ANY ODD STUFF LEFT?
- BEQ.S @3
- ; PROCESS 7 OR LESS MOVES
- @6: MOVE.B (A1)+,(A0)+
- SUBQ.B #1,D2
- BGT.S @6
- MOVE.L (SP)+,A2 ; restore A2
- return
- }
- }
-
- /* copy buffer of size from source to dest */
- cpybuf(dest,source,size)
- char *dest;
- char *source;
- short size;
- {
- asm
- {
- MOVE.L A2,-(SP) ; save A2
- MOVEA.L dest,A0
- MOVE.L source,A1 ; COPY SOURCE
- MOVEQ #0,D2
- MOVE.W size,D2 ; LONG-EXTEND SIZE
- BLE.S @3
-
- ; NONZERO MOVE
- CMPA.L A0,A1 ; SOURCE <CMP> A0
- BGT.S @4
- ; TEST FOR OVERLAP
- MOVE.L A1,A2
- ADDA.L D2,A2 ; MAKE ONE PAST SOURCE BUF (SRCEND)
- CMPA.L A2,A0 ; DEST <CMP> SRCEND
- BGE.S @4 ; IMPLIES NO OVERLAP
- ADDA.L D2,A0 ; MAKE END OF DEST ARRAY
- ; BACKWARDS LOOP
- MOVE.L D2,D0
- LSR.L #3,D0 ; COMPUTE BATCHES
- BEQ.S @2 ; GO FINISH UP REMAINDER - SMALL MOVE
- ANDI.B #7,D2 ; TAKE REMAINDER (NOTE GUARANTEED SMALL)
- @1: MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- MOVE.B -(A2),-(A0)
- SUBQ.L #1,D0 ; ONE LESS BATCH
- BGT.S @1
- TST.B D2 ; ANY ODD STUFF LEFT?
- BEQ.S @3
- ; PROCESS 7 OR LESS MOVES
- @2: MOVE.B -(A2),-(A0) ; MOVE A BYTE
- SUBQ.B #1,D2
- BGT.S @2
- @3: MOVE.L (SP)+,A2 ; restore A2
- return
-
- ; FORWARDS LOOP
- @4: MOVE.L D2,D0
- LSR.L #3,D0 ; COMPUTE BATCHES
- BEQ.S @6 ; GO FINISH UP REMAINDER - SMALL MOVE
- ANDI.B #7,D2 ; TAKE REMAINDER (NOTE GUARANTEED SMALL)
- @5: MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- MOVE.B (A1)+,(A0)+
- SUBQ.L #1,D0 ; ONE LESS BATCH
- BGT.S @5
- TST.B D2 ; ANY ODD STUFF LEFT?
- BEQ.S @3
- ; PROCESS 7 OR LESS MOVES
- @6: MOVE.B (A1)+,(A0)+
- SUBQ.B #1,D2
- BGT.S @6
- MOVE.L (SP)+,A2 ;restore A2
- return
- }
- }
-
- /* fill buffer with given character, long length */
- longfillbuffer(p, size, c)
- char *p;
- long size;
- char c;
- {
- asm
- {
- MOVEM.L D3-D5,-(SP) ; save reg's
- MOVE.L 12(A6),D1 ; LOAD LONG SIZE
- MOVE.W 16(A6),D2 ; LOAD BYTE TO FILL WITH
- MOVEA.L 8(A6),A0 ; LOAD P
- MOVE.L A0,D0
- BTST #0,D0 ; IS P ODD?
- BEQ.S @NOTODD
- MOVE.B D2,(A0)+ ; *P++ = CH;
- SUBQ.L #1,D1 ; SIZE--;
- NOTODD: MOVEA.L A0,A1 ; Q = P + SIZE;
- ADDA.L D1,A1
- EBYTES: MOVE.B D1,D3 ; WHILE (SIZE&0XF)
- ANDI.B #0x0F,D3
- BEQ.S @READYFILL ; {
- MOVE.B D2,-(A1) ; *--Q = CH;
- SUBQ.L #1,D1 ; SIZE--;
- BRA.S @EBYTES ; }
- READYFILL:
- TST.L D1 ; IF (SIZE)
- BEQ.S @DONEFILL ; {
- ; CREATE 16 BYTES OF PATTERN IN D2-D5
- ANDI.W #0xFF,D2
- MOVE.W D2,D3
- LSL.W #8,D3
- ADD.W D2,D3
- MOVE.W D3,D2
- SWAP D2
- MOVE.W D3,D2
- MOVE.L D2,D3
- MOVE.L D2,D4
- MOVE.L D2,D5 ; D2-D5 = 16 BYTES OF FILL CHAR
- MOVEQ #16,D0 ; amount to decrement the count
- LFLP: MOVEM.L D2-D5,-(A1) ; fill 16 bytes (backwards through buffer)
- SUB.L D0,D1 ; D1 := D1 - 16
- BGT.S @LFLP ; loop
- DONEFILL:
- MOVEM.L (SP)+,D3-D5 ; restore reg's
- return
- }
- }
-
- /* fill buffer with given character, short length */
- fillbuffer(p,size,c)
- char *p;
- short size;
- char c;
- {
- asm
- {
- MOVEM.L D3-D5,-(SP) ; save reg's
- MOVEQ #0,D1
- MOVE.W 12(A6),D1 ; LOAD LONG-EXTENDED SIZE
- MOVE.W 14(A6),D2 ; LOAD BYTE TO FILL WITH
- COMMONFILL: ; BRANCH HERE FOR LONG SIZE CASE.
- MOVEA.L 8(A6),A0 ; LOAD P
- MOVE.L A0,D0
- BTST #0,D0 ; IS P ODD?
- BEQ.S @NOTODD
- MOVE.B D2,(A0)+ ; *P++ = CH;
- SUBQ.L #1,D1 ; SIZE--;
- NOTODD: MOVEA.L A0,A1 ; Q = P + SIZE;
- ADDA.L D1,A1
- EBYTES: MOVE.B D1,D3 ; WHILE (SIZE&0XF)
- ANDI.B #0x0F,D3
- BEQ.S @READYFILL ; {
- MOVE.B D2,-(A1) ; *--Q = CH;
- SUBQ.L #1,D1 ; SIZE--;
- BRA.S @EBYTES ; }
- READYFILL:
- TST.L D1 ; IF (SIZE)
- BEQ.S @DONEFILL ; {
- ; CREATE 16 BYTES OF PATTERN IN D2-D5
- ANDI.W #0xFF,D2
- MOVE.W D2,D3
- LSL.W #8,D3
- ADD.W D2,D3
- MOVE.W D3,D2
- SWAP D2
- MOVE.W D3,D2
- MOVE.L D2,D3
- MOVE.L D2,D4
- MOVE.L D2,D5 ; D2-D5 = 16 BYTES OF FILL CHAR
- MOVEQ #16,D0 ; amount to decrement the count
- LFLP: MOVEM.L D2-D5,-(A1) ; fill 16 bytes (backwards through buffer)
- SUB.L D0,D1 ; D1 := D1 - 16
- BGT.S @LFLP ; loop
- DONEFILL:
- MOVEM.L (SP)+,D3-D5 ; restore reg's
- return
- }
- }
-